#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"

#define KEY0VALUE 0XF0
#define INVAKEY 0X00

int main(int argc, char *argv[])
{
    int fd, ret;
    char *filename;
    int keyvalue;
    int last_keyvalue = INVAKEY; // 记录上一次确认的按键值
    int temp_keyvalue;
    int detected_keyvalue = INVAKEY; // 检测到的临时按键值
    int need_confirm = 0; // 是否需要确认
    
    printf("key_app start 2!\r\n");
    
    if (argc != 2)
    {
        printf("Error Usage!\r\n");
        return -1;
    }

    filename = argv[1];
    fd = open(filename, O_RDWR);
    if(fd < 0){
        printf("file %s open failed!\r\n", filename);
        return -1;
    }
    
    /* 循环读取按键值数据！ */
    while(1){ 
        // 读取当前按键值
        read(fd, &temp_keyvalue, sizeof(temp_keyvalue));
        
        // 如果检测到按键状态变化，开始消抖确认流程
        if(temp_keyvalue != last_keyvalue && !need_confirm) {
            detected_keyvalue = temp_keyvalue;
            need_confirm = 1;
        }
        
        // 如果需要确认且50ms后状态仍然一致
        if(need_confirm) {
            if(temp_keyvalue == detected_keyvalue) {
                // 延时50ms再次确认
                usleep(50000); // 50ms
                
                // 再次读取确认状态
                read(fd, &temp_keyvalue, sizeof(temp_keyvalue));
                if(temp_keyvalue == detected_keyvalue) {
                    // 确认按键状态变化
                    if (temp_keyvalue == KEY0VALUE) {
                        printf("key0 is pressed! value = %#X\r\n", temp_keyvalue);
                    } else if (temp_keyvalue == INVAKEY) {
                        printf("key0 is released! value = %#X\r\n", temp_keyvalue);
                    }
                    
                    // 更新上一次确认的按键值
                    last_keyvalue = temp_keyvalue;
                    need_confirm = 0;
                }
            } else {
                // 状态发生变化，取消确认
                need_confirm = 0;
            }
        } else {
            // 添加短暂延时，控制采样频率
            usleep(10000); // 10ms
        }
    }

    ret = close(fd);
    if (ret < 0)
    {
        printf("file %s close failed!\r\n", filename);
        return -1;
    }
    return 0;
}